package leetcode;

public class Code36 {

    public static void main(String[] args) {
        char[][] item = new char[][]{
                {'.', '.', '4', '.', '.', '.', '6', '3', '.'},
                {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
                {'5', '.', '.', '.', '.', '.', '.', '9', '.'},
                {'.', '.', '.', '5', '6', '.', '.', '.', '.'},
                {'4', '.', '3', '.', '.', '.', '.', '.', '1'},
                {'.', '.', '.', '7', '.', '.', '.', '.', '.'},
                {'.', '.', '.', '5', '.', '.', '.', '.', '.'},
                {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
                {'.', '.', '.', '.', '.', '.', '.', '.', '.'}
        };
        System.out.println(new Code36().isValidSudoku(item));
    }

    public boolean isValidSudoku(char[][] board) {
        return lineAndWiner(board) && block(board);
    }

    public boolean lineAndWiner(char[][] board) {
        int[] lineIndex = new int[10];
        int[] wineIndex = new int[10];
        for (int a = 0; a < 9; a++) {
            initArr(lineIndex);
            initArr(wineIndex);
            for (int b = 0; b < 9; b++) {
                if (board[a][b] != '.') {
                    if (lineIndex[Character.getNumericValue(board[a][b])] != 0) {
                        return false;
                    }
                    lineIndex[Character.getNumericValue(board[a][b])] = 1;
                }
                if (board[b][a] != '.') {
                    if (wineIndex[Character.getNumericValue(board[b][a])] != 0) {
                        return false;
                    }
                    wineIndex[Character.getNumericValue(board[b][a])] = 1;
                }
            }
        }
        return true;
    }

    private void initArr(int[] index) {
        for (int a = 0; a < index.length; a++) {
            index[a] = 0;
        }
    }


    public boolean block(char[][] board) {
        int[] item = new int[10];
        for (int a = 0; a < 9; a = a + 3) {
            for (int b = 0; b < 9; b = b + 3) {
                initArr(item);
                for (int c = 0; c < 3; c++) {
                    for (int d = 0; d < 3; d++) {
                        if (board[c + a][d + b] != '.') {
                            if (item[Character.getNumericValue(board[c + a][d + b])] != 0) {
                                return false;
                            }
                            item[Character.getNumericValue(board[c + a][d + b])] = 1;
                        }
                    }
                }
            }
        }
        return true;
    }
}
